﻿using System;
using System.Threading;
using System.Windows.Forms;

namespace Service.src.NW.UI
{

    public static class UIThreadManager
    {
        // 唯一的STA线程
        private static Thread _uiThread;
        // 用于跨线程调用的同步上下文
        public static SynchronizationContext UIContext { get; private set; }
        // 标记线程是否已初始化
        public static bool IsInitialized => _uiThread != null && _uiThread.IsAlive;

        /// <summary>
        /// 初始化UI线程（在应用启动时调用）
        /// </summary>
        public static void Init()
        {
            if (IsInitialized) return;

            // 创建STA线程
            _uiThread = new Thread(UIThreadStart)
            {
                IsBackground = false, // 确保UI线程不会被后台线程终止
                ApartmentState = ApartmentState.STA // 强制STA线程模型
            };
            _uiThread.Start();

            // 等待UI线程初始化完成
            //while (UIContext == null)
            //{
            //    Thread.Sleep(10);
            //}
        }

        /// <summary>
        /// UI线程的入口方法
        /// </summary>
        private static void UIThreadStart()
        {
            // 初始化WinForms的消息循环
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 捕获当前线程的同步上下文（用于跨线程调用）
            UIContext = SynchronizationContext.Current;

            // 启动消息循环（保持UI线程存活）
            Application.Run();
        }

        /// <summary>
        /// 在UI线程中执行操作
        /// </summary>
        public static void Invoke(Action action)
        {
            if (!IsInitialized)
            {
                throw new InvalidOperationException("UI线程未初始化，请先调用Init()");
            }

            // 如果当前在UI线程，直接执行；否则通过同步上下文调用
            if (SynchronizationContext.Current == UIContext)
            {
                action();
            }
            else
            {
                UIContext.Send(_ => action(), null); // 同步调用（等待结果）
                                                     // 若需要异步调用，使用UIContext.Post
            }
        }

        /// <summary>
        /// 关闭UI线程（应用退出时调用）
        /// </summary>
        public static void Shutdown()
        {
            if (IsInitialized)
            {
                Invoke(() => Application.ExitThread());
                _uiThread.Join();
                _uiThread = null;
                UIContext = null;
            }
        }
    }
}
